\documentclass{iccmemoria}

\titulo{Diseño e Implementación de algoritmos para la captura y decodificación de códigos de barra QRCode en dipositivos móviles }
\author{Luis Eduardo González Martínez}
\supervisor{Benjamin Ingram}
\informantes{Castor}{}
\adicional{}
\date{}
\usepackage{graphicx}
\usepackage{amssymb}

\begin{document}
\renewcommand{\listtablename}{Índice de tablas}
\renewcommand{\tablename}{Tabla~}

\maketitle

%dedicatoria

\begin{dedicatory}
	Dedicatoria
\end{dedicatory}

%agradecimientos
\begin{acknowledgment}
\end{acknowledgment}

\tableofcontents
\listoffigures
%\listoftables

\begin{resumen}
\end{resumen}


\begin{abstract}
\end{abstract}


\chapter{Introducción}
\section{Descripción}
	Los códigos de barra aparecen cada vez con más frecuencia en nuestro diario vivir, un claro ejemplo de ello, son las tiendas o supermercados, cada producto que ahí se encuentra es etiquetado con un código de barra, el cual permite obtener la especificación única del producto.\\
	El problema aparece al momento de leer este código para obtener su información, puesto que en muchas ocasiones, se necesitan instrumentos adecuados para su correcta lectura, además de software que permita captar y procesar la información.\\
	Las cámaras pueden ser utilizadas para identificar objetos, es decir, si las imágenes presentan un código de barra en una superficie visible, entonces un sistema con una cámara portátil podría reconocerlo y proporcionar al usuario la información que mantiene codificada.\\
	Por todo lo anterior, este proyecto pretende ofrecer una herramienta que permita localizar un código de barra dentro de una imagen, para su posterior decodificación.\\
	Existe una gran variedad de códigos de barras, pero este proyecto está enfocado en un tipo en especial, llamado QR Code (Quick Response Code). QR Code que es un tipo de código de dos dimensiones que está teniendo un gran impacto en los sistemas de información, permitiendo obtener muchos datos en muy poco tiempo.\\

\begin{figure}
  \centering
    \includegraphics[width=4cm]{Codigo_QR.eps}
  \caption{Código QR que dice: Ojalá vivas tiempos interesantes}
  \label{fig:QR Code Ejemplo}
\end{figure}

%http://es.wikipedia.org/wiki/Archivo:Codigo_QR.svg  faltan las referencias.
\newpage
	Estos códigos se pueden utilizar en distintos tipos de tareas, tales como, aceder a un enlace Web, realizar una llamada telefónica, enviar un Email, añadir un contacto telefónico, navegar en Google Maps a un punto de interés, realizar una búsqueda en Internet, etc. Las cuales pueden ser útiles para una gran variedad de negocios.\\	
	La herramienta propuesta pretende aumentar las probabilidades de decodificación del sistema, aplicando técnicas de procesamiento de imágenes, supliendo la limitante de sistemas actuales que no corrigen el error del usuario al momento de capturar la imagen con un ángulo, rotación o inclinación indebida; provocando errores, demoras en la decodificación, por tener que hacer la captura nuevamente, y más importante, la pérdida de la información que contiene el código.

\section{Contexto}
	Al realizar captura de imágenes con dispositivos móviles, éstas pueden verse afectadas por el pulso de la persona que captura, esto produce que el código de barra aparezca con un cierto grado de rotación, inclinación o que el código esté en una imagen más amplia, que no esté enfocada precisamente en el código de barra a decodificar.	
\section{Alcance}
		El proyecto pretende alcanzar una probabilidad más alta de decodificación de códigos de barra QR Code, aplicando algoritmos avanzados de procesamiento de imágenes, logrando capturar la imagen, analizarla, decodificarla y entregando el resultado de la decodificación al usuario, a través de la interfaz de la aplicación.\\
	Una de las limitantes más grandes para este proyecto es el escaso poder de procesamiento que poseen los dispositivos móviles, en este proyecto específico los teléfonos celulares, limitando el procesamiento de imágenes por el tiempo que esto podría tomar.
\section{Objetivo general}
	Desarrollar una aplicación en Java para dispositivos móviles que sea capaz de interpretar un símbolo QR Code 2006 compatible y decodificar su mensaje. Ademas implementar algoritmos de tratamiento de imágenes para mejorar el éxito en la decodificación.
\section{Objetivos específicos}
\begin{itemize}
\item Investigar plataformas y el lenguaje de programación para dispositivos móviles.
\item Implementar algoritmos de captura de imágenes.
\item Investigar algoritmos de procesamiento de imágenes para resolver problemas de ángulos e inclinación en la imagen.
\item Implementar algoritmos de procesamiento de imágenes para decodificar códigos QR Code.
\item Hacer comparación de resultados utilizando los distintos algoritmos y buscar posibles combinaciones que entreguen un mejor resultado.
\item Escribir memoria.
\end{itemize}
	
%\section{Delimitación}
	

\chapter{Marco Teórico}
%El objetivo del presente capítulo es definir los conceptos teóricos que permitan avalar las propuestas de esta memoria. 
El código bidimensional QR Code se define en la norma ISO 18004, la cual describe en su totalidad las partes y procesos que se realizan para obtener alguna versión del código. Es por esto que se debe estudiar en su totalidad todo lo que concierne a este código. Además se revisarán algoritmos de procesamiento de imágenes, que se utilizaran para desarrollar el objetivo de esta memoria.
\section{¿Qué es QR Code?}

QR Code o Quick Response Code (Código de Respuesta Rápida), es un estándar de
“código de barras bidimensional”.\\
Se creo en el año 1994, por la empresa japonesa Denso Wave. Esta empresa distribuye las especificaciones del QR Code en forma gratuita, aún cuando posee una patente de este código, pero no ejerce los derechos de esta.
Existen dos estándares para la descripción del QR Code, El estándar japonés JIS X 0510, redactado en japonés y distribuido el año 1999 y el estándar de la ISO, ISO/IEC 18004, aprobado en junio del año 2000 y revisado el 2006.\\
\\
El éxito del uso de este tipo de código, es su estándar abierto y lo fácil de la decodificación en cualquier teléfono móvil que cuente con una cámara, sin  importar la calidad de ésta.\\
En Japón es muy utilizado este código y es muy raro que los teléfonos móviles no vengan con un software incorporado para decodificarlos.

\subsection{Ventajas del QR Code}
% sacado de http://www.denso-wave.com/qrcode/aboutqr-e.html
QR Code (Código 2D) contiene información en las direcciones vertical y horizontal, mientras que un código de barras contiene datos en una sola dirección. Por lo tanto el código QR Code tiene un volumen mucho mayor de información que un código de barras.\
Este código posee características de almacenamiento de datos que lo diferencian de sus principales competencias, puesto que, es capaz de almacenar hasta 7.089 dígitos, 4.296 caracteres alfanuméricos, 2.953 números binarios y además tiene la particular capacidad de almacenar 1.817 caractéres Kanji que son las letras del alfabeto japonés.

\begin{figure}
  \centering
    \includegraphics[width=8cm]{comparacionCodigos.eps}
  \caption{Comparación de Códigos de barra de una y dos dimensiones}
  \label{fig:Comparacion}
\end{figure}

\subsection{Corrección de Errores}
Los códigos QR Code tienen la capacidad de corregir errores para restaurar los datos si el código se encuentra sucio o dañado.
Existen 4 niveles de corrección de errores, llegando a recuperar hasta un 30\% de la información perdida debido a la suciedad o daño del código.
%falta imagen con la descripcion de los errores aunque no es necesario


\subsection{Otras Características}
Los códigos QR Code pueden ser leídos a gran velocidad, puesto que poseen patrones localizadores que ayudan a detectar su posición. Así la posición del código no es crítica a diferencia de los códigos de barra de una dimensión que necesitan estar alineados horizontalmente.\\
%foto con los patrones resaltados
%http://www.denso-wave.com/qrcode
Existen otros códigos bidimensionales, como el DataMatrix que tambien está estandarizado. La diferencia con el QR Code y los demás códigos es la velocidad a la que se decodifica, de ahí el nombre de Quick Response (QR).\\
Además no es necesario que la imagen tomada sea de gran calidad, puesto que se pierde espacio para almacenar datos.

\section{Resumen del estándar de QR Code.}
\subsection{Términos y Definiciones}
Definición de los principales términos del estándar QR Code.\\
\begin{itemize}

\item \textbf{Contador de Caracteres:}
Secuencia de bits que define la longitud de la cadena de datos en un modo.

\item \textbf{Enmascarado de Datos:}
 Proceso por el cual se realiza la operación XOR, con un patrón de máscara, a los módulos de la región de codificación, esto aumenta la diferencia entre módulos blancos y negros mejorando la decodificación.

\item \textbf{Patrón de referencia de la máscara de datos:} 
Tres bits identifican el patrón de la máscara de datos en el símbolo.

\item \textbf{Región de Codificación:}
 Región del símbolo no ocupada por los patrones de funcionamiento y disponible para la codificación de datos, corrección de errores, identificación de la versión del código y el formato del mismo.
 
\item \textbf{Formato de la Información:} 
 Patrón codificado que contiene la información sobre las características del símbolo, el grado de corrección de errores con el que se han encriptado los datos y el tipo de máscara que se les ha aplicado.

\item \textbf{Patrón de alineación:}
Permite resincronizar las coordenadas de mapeo de la imagen QR Code ante posibles distorsiones moderadas del área.

\item \textbf{Patrón de Función:}
Parte del símbolo que no contiene datos codificados, sino la información necesaria para hacer el proceso de decodificación de los datos. Los patrones de función son: patrón de localización, separador, patrón de alineamiento y patrón temporizador.

\item \textbf{Modo:}
Método en el que se representa un conjunto de datos como una cadena de bits. Estos datos pueden ser del tipo: alfanuméricos, numéricos, bytes, kanji o cualquier otro que se pueda definir.

\item \textbf{Indicador de Modo:}
Cuatro bits que indican el modo con el que se ha codificado la información de los siguientes datos.

\item \textbf{Bit de relleno:}
Bits que se usan para rellenar una palabra después del terminador para obtener un número fijo de datos en cada bloque de datos del código.

\item \textbf{Patrón Localizador:}
Son tres patrones que sirven para calcular la orientación rotacional del código. Estos patrones se encuentran en las esquinas superiores e inferior izquierda.

\item \textbf{Bits Restantes:}
Usados para rellenar algunas posiciones de la región codificada donde el espacio no se divide en 8 bits.

\item \textbf{Palabra Códificada (Codeword):}
Conjunto de 8 módulos que pueden tener diferentes formas dependiendo de su localización en el símbolo y que sirve para almacenar información codificada de los datos o de la corrección de errores.

\item \textbf{Palabra Códificada Restante:}
Codeword para rellenar posiciones sin codeword asignados, completan la capacidad total del código.


\item \textbf{Módulo:}
Cuadro blanco o negro que en conjunto definen un QR Code.

\item \textbf{Separador:}
Patrón de función formado por módulos blancos; tiene un ancho de un módulo y separa los patrones localizadores del resto del código.

\item \textbf{Terminador:}
Patrón de bits ceros de un número definido, en función del código, que se usa para poner fin a la cadena de bits que representan datos.

\item \textbf{Versión:}
Tamaño del código que puede ir de la versión 1 de 21x21 módulos hasta 40 de 177x177 módulos. 

\item \textbf{Zona de silencio:}
Zona que rodea al código de color blanco que permite delimitar sus bordes, debe ser al menos de 4 módulos.ncronizar las coordenadas de mapeo de la imagen QR Code ante posibles distorsiones moderadas del área.


\end{itemize}


\subsection{Características Principales}

Los códigos QR Code tienen 40 versiones y 4 grados para corregir errores (L,M,Q,H). Así un código 40-H se puede decir que es de la versión 40 y su grado de corrección de errores es H. Cada versión tiene un tamaño siendo la 1 de 21x21 módulos y 40 de 177x177 módulos la más grande, aumentando en 4 módulos cada versión.\\

Formato de los datos a codificar.
\begin{itemize}
\item Datos numéricos (0-9).
\item Datos alfanuméricos (0-9, A-Z y otros 9 caractéres: espacio,\$,\%,*,+,-,.,/,:).
\item bytes (por defecto ISO/IEC 8859-1).
\item Caractéres Kanji, compactados en 13 bits (caractéres del alfabeto japonés).
\end{itemize}

Para un código de versión 40-L, el número máximo de datos que puede contener es:
\begin{itemize}
\item Datos numéricos: 7089 caractéres.
\item Datos alfanuméricos: 4296 caractéres.
\item Bytes: 2953 caractéres.
\item Caractéres Kanji: 1817 caractéres.
\end{itemize}

La corrección de errores se basa en Reed Solomon y tiene 4 niveles.

%falta referencia para reed-solomon

\begin{itemize}
\item L (low) bajo, puede corregir hasta el 7\% de los corewords del código.
\item M (medium) medio, puede corregir hasta el 15\% de los codewords del código.
\item Q (quality) calidad, puede corregir hasta el 25\% de los codewords del código.
\item H (high) alto, puede corregir hasta el 30\% de los codewords del código.
\end{itemize}

Los módulos del código pueden ser blancos o negros y representan respectivamente el 0 y el 1 binario.
%mostrar imagen del codigo

\subsection{Estructura del Código}
Los QR Code están formados por módulos colocados en una estructura cuadrada. Ésta estructura contiene la región de codificación y los patrones de función que son: patrón localizador, separador, patrón temporizador y patrón de alineamiento. El código debe estar rodeado por una zona de silencio.



%imagen sacada de la ISO
\begin{figure}[h]
  \centering
    \includegraphics[width=10cm]{estructura.eps}
  \caption{Estructura de un código QR Code versión 7}
  \label{fig:Estructura}
\end{figure}

Las versiónes, además del tamaño, se diferencian por el número de codewords que contienen y el patrón de alineamiento, algunas versiones tienen bits de relleno y otras no y las versiones anteriores a la 7 no tienen información de la versión. La versión 1 no tiene patrones de alineamiento. Todas la versiones tienen los tres patrones localizadores, dos patrones temporizadores, tres separadores y la información de formato por duplicado.

El patrón localizador se sitúa en las esquinas superior izquierda, superior derecha e inferior izquierda del código QR Code. Está formado por un cuadro de 3x3 de módulos negros, el cual esta rodeado por un cuadro de 5x5 de módulos blancos a su vez rodeado por otro cuadro de 7x7 de módulos negros. Encontrar este patrón será muy difícil dentro de otras partes del código lo que hace improbable que se provoquen errores por este motivo.

%imagen sacada de la ISO
\begin{figure}[h]
  \centering
    \includegraphics[width=8cm]{patronlocalizador.eps}
  \caption{Estructura de un código QR Code versión 7}
  \label{fig:Patron Localizador}
\end{figure}

Los separadores están formados por módulos blancos y rodean los bordes de los patrones localizadores que dan a la parte interior del símbolo.

Los patrones temporizadores son dos, uno vertical y otro horizontal. Están formados por una línea de módulos de color alternados, comenzando y terminando en un módulo negro. Son usados para obtener la versión del código y para que las coordenadas de los módulos puedan ser determinadas. El patrón temporizador horizontal cruza la fila número 6 entre los separadores superiores y el vertical igual pero cruzando la columna 6.

Los patrones de alineamiento están formados por un módulo negro, rodeado de un cuadro de 3x3 de módulos blancos, el cual esta rodeado por otro cuadro de 5x5 de módulos negros. El número de estos patrones varía según la versión del código.

La región de codificación contiene los codewords que representan los datos, también contiene codewords para la corrección de errores, la información de formato y la información de versión en la mayoria de los casos.




\begin{center}
   \begin{tabular}{| l | p{2cm} | p{2cm} | p{2cm} | p{2cm} | p{2cm} | p{2cm} |}  
   \hline
Versión & Número de módulos por lado & Módulos de patrones de función &Módulos de información de formato y versión& Módulos de datos&Codewords de datos&Bits restantes\\ \hline
1 & 21 & 202 & 31 & 208 & 26 & 0 \\ \hline
2 & 25 & 235 & 31 & 359 & 44 & 7 \\ \hline
3 & 29 & 243 & 31 & 567 & 70 & 7 \\ \hline
4 & 33 & 251 & 31 & 807 & 100 & 7\\ \hline
5 & 37 & 259 & 31 & 1079 & 134 & 7\\ \hline
6 & 41 & 267 & 31 & 1383 & 172 & 7\\ \hline
7 & 45 & 390 & 67 & 1568 & 196 & 0\\ \hline
8 & 49 & 398 & 67 & 1936 & 242 & 0\\ \hline
9 & 53 & 406 & 67 & 2336 & 292 & 0\\ \hline
10 & 57 & 414 & 67 & 2768 & 346 & 0\\ \hline
11 & 61 & 422 & 67 & 3232 & 404 & 0\\ \hline
12 & 65 & 430 & 67 & 3728 & 466 & 0\\ \hline
13 & 69 & 438 & 67 & 4256 & 532 & 0\\ \hline
14 & 73 & 611 & 67 & 4651 & 581 & 3\\ \hline
15 & 77 & 619 & 67 & 5243 & 655 & 3\\ \hline
16 & 81 & 627 & 67 & 5867 & 733 & 3\\ \hline
17 & 85 & 635 & 67 & 6523 & 815 & 3\\ \hline
18 & 89 & 643 & 67 & 7211 & 901 & 3\\ \hline
19 & 93 & 651 & 67 & 7931 & 991 & 3 \\ \hline
20 & 97 & 659 & 67 & 8683 & 1085 & 3\\ \hline
21 & 101 & 882 & 67 & 9252 & 1156 & 4\\ \hline
22 & 105 & 890 & 67 & 10068 & 1258 & 4\\ \hline
23 & 109 & 898 & 67 & 10916 & 1364 & 4\\ \hline
24 & 113 & 906 & 67 & 11796 & 1474 & 4\\ \hline
25 & 117 & 914 & 67 & 12708 & 1588 & 4\\ \hline
26 & 121 & 922 & 67 & 13652 & 1706 & 4\\ \hline
27 & 125 & 930 & 67 & 14628 & 1828 & 4\\ \hline
28 & 129 & 1203 & 67 & 15371 & 1921 & 3\\ \hline
29 & 133 & 1211 & 67 & 16411 & 2051 & 3\\ \hline
30 & 137 & 1219 & 67 & 17483 & 2185 & 3\\ \hline
31 & 141 & 1227 & 67 & 18587 & 2323 & 3 \\ \hline
32 & 145 & 1235 & 67 & 19723 & 2465 & 3\\ \hline

   \end{tabular}
 \end{center}
 
\begin{center}
   \begin{tabular}{| l | p{2cm} | p{2cm} | p{2cm} | p{2cm} | p{2cm} | p{2cm} |}  
   \hline 
   33 & 149 & 1243 & 67 & 20891 & 2611 & 3\\ \hline
34 & 153 & 1251 & 67 & 22091 & 2761 & 3\\ \hline
35 & 157 & 1574 & 67 & 23008 & 2876 & 0\\ \hline
36 & 161 & 1582 & 67 & 24272 & 3034 & 0\\ \hline
37 & 165 & 1590 & 67 & 25568 & 3196 & 0\\ \hline
38 & 169 & 1598 & 67 & 26896 & 3362 & 0\\ \hline
39 & 173 & 1606 & 67 & 28256 & 3532 & 0\\ \hline
40 & 177 & 1614 & 67 & 29648 & 3706 & 0\\ \hline 
  \end{tabular}
 \end{center}
\section{Proceso de Codificación.}

El proceso de codificación se puede dividir en 7 pasos.

\begin{enumerate}

\item {\bf Análisis de Datos.}
Se analizan los datos a codificar identificando de qué tipo son sus caractéres, para calcular en que modos codificarlos. El estándar soporta varios modos de codificación, pudiendo usarse a la vez diferentes modos para cada subconjunto de caractéres. Si no se especifíca la versión a usar, se debe usar la menor versión necesaria.
\item {\bf Codificación de datos.}
Se convierten los datos en una cadena de conjunto de bits dependiendo del modo usado. Se inserta un indicador de modo delante de cada subconjunto de datos y un terminados al final del mismo para saber en qué modo están codificados y dónde termina el subconjunto. Finalmente se dividen los datos en codewords de 8 bits.
\item {\bf Codificación de corrección de errores.}
Se ejecuta el algoritmo de corrección de error, para generar los codewords de corrección de errores. Éstos se añaden al final de los codewords de datos.
\item {\bf Estructura final del mensaje.}
Se entrelazan los codewords de datos y de corrección de error y se añaden los bits de relleno si es necesario.
\item {\bf Colocación de Módulos en el código.}
Se colocan los módulos de los codewords en el código QR Code junto a los patrones de función para formar un símbolo QR Code.
\item {\bf Enmascarar los datos.}
Se aplican los patrones de enmascarado de datos a la región de codificación. Se evalúan los resultados y se selecciona el patrón que optimice el balance entre módulos blancos y negros y minimice la aparición de patrones indeseados.
\item {\bf Formato y versión de formato.}
Generar la información de formato y la de versión si es necesario y colocarla en el símbolo para completarlo.
\end{enumerate}


\subsection{Análisis de los Datos.}
Los datos que se codifican pueden tener diferentes formatos, además pueden dividirse en conjunto de datos que tienen diferentes tipos o tamaños. Los datos se analizan para ver su formato y encontrar el modo apropiado para codificarlos. Se puede cambiar el modo para optimizar el espacio dentro del código. Se puede hacer la codificación más eficiente si el dato se codifica en el modo que requiere menos bits por carácter, teniendo en cuenta el espacio de la cabecera. La cabecera está compuesta del indicador de modo y el contador de caractéres y se sitúa delante de cada subconjunto de datos. Si el conjunto es pequeño no se codifica en cualquier modo, dado que no vale la pena codificar en un modo específico un pequeño conjunto. Además, si el código QR Code aumenta su capacidad en una forma discreta en cada versión, no es necesario alcanzar siempre la eficiencia máxima.\\

Los modos en los cuales se pueden encontrar los datos son los siguientes:
\begin{itemize}
\item \textbf{Modo Númerico.}\\
Se codifican los caractéres numéricos del conjunto [0-9]. Generalmente, 3 caractéres se representan con 10 bits en este modo.

\item \textbf{Modo Alfanumérico.}\\
Se codifica un conjunto de 45 caractéres. Los cuales son: 10 dígitos del modo numérico, 26 caractéres del alfabeto internacional y 9 símbolos más (espacio, \$, \%, *, +, -, . , /,:). Dos caractéres alfanuméricos se representan con 11 bits en este modo.
\item \textbf{Modo Byte.}\\
Los datos se codifican con 8 bits por carácter en código ASCII.

\item \textbf{Modo Kanji.}\\
Codifica los caractéres Kanji del alfabeto japonés de acuerdo con el sistema Shift Jis basado en JIS X 0208. Cada carácter de dos bytes es compactado en un codeword de 13 bits.

\item \textbf{Modo Interpretación de canal extendido (ICE).}\\
Permite especificar interpretaciones particulares de un modo para crear un conjunto de caractéres particular.
\end{itemize}


\subsection{Codificación de Datos.}
Los datos son convertidos en un flujo de bits consistente en uno o más subconjuntos de modos diferentes. Utilizando el ICE por defecto, el flujo de bits inicia con el primer indicador de modo. Si se utiliza más ICEs diferentes, el flujo comenzará con la cabecera ICE, seguida del primer subconjunto de datos y así sucesivamente hasta completar el código.\\

La cabecera ICE se compone de un indicador de modo de 4 bits y un designador de CE que puede ser de 8, 16 ó 24 bits. Esta cabecera empieza con el bit más significativo del indicador de modo y termina con el menos significativo del designador ICE.\\
 
Los subconjuntos tienen un tamaño de 4 bits y se componen de un indicador de modo, un contador de caractéres y los datos almacenados. Además cada subconjunto de modo empieza con el bit más significativo del indicador de modo y termina con el bit menos significativo del flujo de datos. Entre los subconjuntos no existen separadores ya que su tamaño y lugar de inicio están delimitados inequívocamente por el indicador de modo y el contador de caractéres.\\

Los indicadores tendrán la siguiente representación en bits.\\
- Numérico = 0001\\
- Alfanumérico = 0010\\
- Byte = 0100\\
- Kanji = 1000\\
- ICE = 0111\\
- Fin de mensaje = 0000\\
% falta tabla del contador de caracteres


Cuando se coloca el último subconjunto de modo se agrega un terminador de fin de mensaje, que es de 4 bits ceros. En algunas ocasiones puede ser omitido, si la capacidad restante del código es menor.\\

En el modo numérico, los datos se dividen en grupos de tres dígitos, cada grupo se convierte en binario de 10 bits. Si el número de dígitos no es múltiplo de tres, se convierten en 4 ó 7 bits, si esque son uno o dos dígitos respectivamente. Finalmente los datos transformatos en binarios son concatenados y además se les agrega el indicador de modo al inicio y el contador de caractéres al final.\\

En el modo alfanumérico, primero a cada caractér se le asigna un valor entre 0 y 44 según la siguiente tabla:

%tabla 



\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
\hline
C&V&C&V&C&V&C&V&C&V&C&V&C&V&C&V\\ \hline
0&0&6&6&C&12&I&18&O&24&U&30&SP&36&.&42\\ \hline
1&1&7&7&D&13&J&19&P&25&V&31&\$&37&/&43\\ \hline
2&2&8&8&E&14&K&20&Q&26&W&32&\%&38&:&44\\ \hline
3&3&9&9&F&15&L&21&R&27&X&33&*&39&&\\ \hline 
4&4&A&10&G&16&M&22&S&28&Y&34&+&40&&\\ \hline 
5&5&B&11&H&17&N&23&T&29&Z&35&-&41&&\\ \hline 
\end{tabular}




Los subconjuntos se agrupan de a dos caractéres codificados en 11 bits. El valor del primer carácter se multiplica por 45 y a ésto se le suma el valor del segundo caracter. La suma es convertida en un número de 11 bits. Si el número de caractéres no es múltiplo de dos se convierte en un número binario de 6 bits. Finalmente los datos binarios son concatenados y se les agrega al inicio el indicador de modo y el contador de caractéres.\\

En el modo Byte, el valor de cada caracter es el mismo que el de su correspondiente codeword de 8 bits. Esto quiere decir que cada carácter  se codifica en 8 bits y que un carácter ocupa exactamente un codeword. Finalmente los datos binarios son concatenados y se les agrega al inicio el indicador de modo y el contador de caractéres.\\

Existe una posibilidad de poder combinar varios modos de codificación para los datos, y así ahorrar espacio. Cada segmento de datos se codificaría con los modos que se indicaron y posteriormente se concatenarían empezando cada subconjunto con el indicador de modo y el contador de caractéres.\\

Al final de los subconjuntos se añade un terminador. El terminador se puede omitir si el espacio no alcanza para éste.


\textbf{Conversión del flujo de bits a codeword.}\\
Ahora los datos codificados se dividen en grupos de 8 bits llamados codewords. En el caso que no sean múltiplos de ocho se añadirán bits de relleno al último codeword. Luego, el mensaje resultante debe ser completado  con codewords de relleno hasta rellenar la capacidad máxima de codewords de la versión de QR Code del código que se está codificando. Estos codewords de relleno son 11101100 y 00010001 que se van añadiendo alternadamente. Terminado esto se añadirán los codewords de corrección de errores como se muestra en el siguiente punto.
% faltan tablas aunque podria dejarlas como anexo nomas
\subsection{Codificación de corrección de errores.}
QR Code utiliza codificación de control de errores de Reed-Solomon para detectar errores. Para ésto se utilizan una seria de codewords de corrección de errores, que se agregan a los datos codificados. Existen cuatro niveles de corrección de errores los cuales son:\\
\begin{itemize}
\item \textbf{L} (Low) con 7 \% de capacidad de recuperación.
\item \textbf{M} (Medium) con 15 \% de capacidad de recuperación.
\item \textbf{Q} (Quality) con 25 \% capacidad de recuperación.
\item \textbf{H} (High) con 30 \% capacidad de recuperación.
\end{itemize}

Este sistema puede corregir dos tipos de errores, cuando un caracter nose puede decodificar (borrón) y cuando se decodifica en un caracter erróneo. Existe una fórmula que relaciona el número de borrones y errores corregibles en un codeword de corrección de errores.\\\\


\begin{equation}
e + 2t \leq d - p\\
\end{equation}

donde:\\
e = número de borrones.\\
t = número de errores.\\
d = número de codewords de corrección de errores.\\
p = número de codewords de protección de QR Code.\\



\subsection{Estructura final del mensaje.}
Se divide la secuencia de codewords en n bloques. Para cada bloque se generan los codewords de corrección de errores. Luego se crea la secuencia final de codewords que tiene el siguiente orden:
Codeword de datos 1 de bloque 1, codeword de datos 1 de bloque 2, codeword de datos 1 de bloque 3, ... , codeword de datos 1 de último bloque, codeword de datos 2 de bloque 1, ... , codeword de datos 2 de último bloque, ... , último codeword de datos de bloque 1, ... , último codeword de datos de último bloque, codeword de error 1 de bloque 1, codeword de error 1 de bloque 2, ... , codeword de error 1 de último bloque, ... , último codeword de error de bloque 1, ... , último codeword de error de último bloque.

\subsection{Colocación de módulos en el código.}
La gran mayoría de los codewords se representan en el código como un bloque de 2x4 ó 4x2 módulos. Aunque algunos tendrán formas irregulares por estar en lugares cercanos a algún patrón de función, como muestra la figura.

\begin{figure}[h]
  \centering
    \includegraphics[width=3cm]{formacodeword.eps}
  
  \label{fig:Forma Codeword}
\end{figure}

Se debe crear una matriz en blanco con el tamaño que corresponde a la versión del código a crear. Además hay que agregar la región de silencio que rodea al código y que debe ser de 4 módulos de tamaño. Se agregan los tres patrones temporizadores, que tienen un tamaño distinto dependiendo de la versión.

La región de codificación se completa con los codewords, comenzando por la parte inferior derecha del código y subiendo hacia arriba hasta llegar al patrón localizador, y después se pasa a la columna adyacente de la izquierda y bajamos hasta llegar al final, para luego volver a subir. Los codewords quedan dispuestos en zig-zag. Cuando la capacidad máxima del código no se llena con los codewords, se rellena con 3, 4 ó 7 bits de relleno. En la figura se muestra la colocación de codewords en un código de versión 2.

\begin{figure}[h]
  \centering
    \includegraphics[width=10cm]{colocacioncodeword.eps}
  
  \label{fig:colocacion}
\end{figure}

\subsection{Enmascarar los datos.}

Para que la decodificación del QR Code mejore es recomendable que el número de módulos blancos y negros sea equillibrado. Se debe evitar el patrón 1011101 ya que se puede confundir con el patrón localizador. Para lograr el equilibrio se debe aplicar una máscara de datos. Esta máscara no se aplica a los patrones de función, la información de formato y la de versión.\\
 A continuación se muestran los posibles patrones y su código para la información de formato.\\
 \begin{center}
\begin{tabular}{|c|l|}
\hline
Código del patrón de máscara de datos & Fórmula\\ \hline
000 & (i + j) mod 2 = 0\\ \hline
001 & i mod 2 = 0\\ \hline
010 & j mod 3 = 0\\ \hline
011 & (i + j) mod 3 = 0\\ \hline 
100 & ((i div 2) + (j div 3)) mod 2 = 0\\ \hline 
101 & (i * j) mod 2 + (i * j) mod 3 = 0\\ \hline
110 & ((i * j) mod 2 + (i * j) mod 3) mod 2 = 0\\ \hline
111 & ((i + j) mod 2 + (i * j) mod 3) mod 2 = 0\\ \hline 
\end{tabular}
\end{center}

\subsection{Formato y versión de formato.}
\subsubsection{Información de Formato.}
La información de formato tiene un tamaño de 15 bits, de los cuales 5 contienen datos y los otros 10 con para recontruir los 5 anteriores en caso de error al decodificar. Para esto se utiliza (15,5) BCH Code.%falta la referecia del paper

De los 5 primeros bits, dos indicn el nivel de corrección de errores usado.\\
L = 01, M = 00, Q = 11, H = 10.\\
Los otros tres bits indican el patrón de máscara utilizado.\\
Cuando los 15 bits se les aplica mediante XOR la máscara 101010000010010, utilizada para evitar que se genere una información de formato compuesta de ceros.\\
Finalmente la información de formato se dispone en la matriz del código por duplicado en las zonas establecidas para esto. La siguiente figura ilustra lo anterior.

\begin{figure}[h]
  \centering
    \includegraphics[width=7cm]{formatoinformacion.eps}
  \label{fig:Formato Informacion}
\end{figure}

\subsubsection{Información de Versión.}
La información de versión se aplica a códigos de versión superior a 7. Se conforma de 18 bits, donde los 6 primeros son de datos y los otros 12 son para corregir errores. Los errores se corrigen mediante (18,6) BHC Code. Los 6 bits de datos contienen la versión del código codificada con el simbolo más significativo primero. Por ejemplo 000111 representa la versión 7, 101000 representa la versión 40. Esta información no es necesario enmascarar, dado que este proceso produciría algunas cadenas de ceros que no tienen información de la versión.\\
La información de la versión se dispone en la matriz del código por duplicado en las zonas establecidas para esto. \\

Con la información que se tiene, se puede comenzar con el procesamiento de imágenes para lograr la decodificación del código y finalmente obtener los datos encriptados en éste.\\

\section{Proceso de decodificación.}

Descripcion general del algoritmo de decodificacion.

\subsection{Algoritmo Decodificacion.}


Los pasos de decodificación de un código QR  son el reverso de la codificación del mismo. La figura XXX muestra un esquema de flujo del proceso.

\begin{enumerate}
\item Localizar y obtener una imagen del código. Reconocer los módulos de luz y oscuridad como una matriz de "0" y "1" bits. Identificar la polaridad del diseño del patrón de búsqueda del código.

\item Leer la información del formato. Obteber el patrón de enmascaramiento y realizar la corrección de errores para el módulo de información del formato, si es necesario. Si tiene éxito, el símbolo está en la orientación normal, por otra parte intentar hacer un espejo de la información de formato. Identificar el nivel de corrección de errores, ya sea directamente, en el Código QR, y los datos de referencia del patrón de enmascaramiento.

\item Leer la información de la versión (cuando corresponda), a continuación, determinar la versión del código.

\item Obtener el patrón de enmascaramiento mediante la operación XOR de la región de bits, dejando de lado los datos de referencia de los cuales se a extraído los datos de información.

\item Leer los caracteres del código de acuerdo con las reglas de colocación para el modelo, restaurar los datos y
  palabras del código para la corrección de errores del mensaje.

\item Detectar los errores con las palabras de código de corrección de errores correspondiente a la información de nivel. Si cualquier error es  detectado, corregir.

\item Dividir las palabras en clave de datos en segmentos de acuerdo a los indicadores de modo y número de caracteres
  indicadores.

\item Por último, descifrar los caracteres de datos de acuerdo con el modo (s)  y obtener el dialogo de resultado.

\begin{figure}[h]
  \centering
    \includegraphics[height=8cm]{flujoDecodificacion.eps}
    \caption{Arquitectura de la plataforma Java 2.}
  \label{fig:Arquitectura de la plataforma Java 2.}
\end{figure}

\end{enumerate}




 
\subsection{Especificación de los pasos de descodificación}



\begin{enumerate}

\item Localizar y obtener una imagen del código.
\begin{itemize}
\item[]  Determinar el umbral global mediante un valor medio entre la reflectancia máxima y mínima de la imagen. Convertir la imagen a un conjunto de pixeles blancos y negros con el umbral global.

\end{itemize}

\item Busqueda de patrón localizador.
\begin{itemize}
\item[] El patrón localizador del código QR se compone de tres módulos iguales situado en tres de las cuatro esquinas del símbolo.

\item[a)]Cuando un área candidata se detecta en cuenta a la posición del primer y ultimo punto Ay B, respectivamente, en que una linea de pixeles de la imagen se encuentra con los bordes exteriores del patrón localizador, Repetir esta operación para las lineas de pixeles adyacentes de la imagen hasta que todas las lineas se crucen en la caja central del patrón localizador.
\end{itemize}

\item Determinar Rotación.
\begin{itemize}
 \item[] Determinar la orientación de rotación del símbolo mediante el análisis del centro de las coordenadas del patrón localizador, identificando que el patrón es el que corresponde al superior izquierdo del código y además obteniendo el ángulo de rotación del mismo.
\end{itemize}

\item Distancias.
\begin{itemize}
 \item[a)] Determinar la distancia D que cruza el símbolo y que va del centro del patrón localizador de la izquierda hasta el centro del patrón localizador de la derecha y determinar el ancho W de los patrones localizadores, como muestra la figura.
\end{itemize}

\item Obtener Tamaños.
\begin{itemize}
 \item[a)] Calcular la dimensión nominal de X que corresponde al tamaño del menor bloque del código. El valor se obtiene de la siguiente manera.
 \begin{equation}
	X = (WUL + WUR) / 14\\
\end{equation}
\end{itemize}

\item Versión Provisoria.
\begin{itemize}
 \item[a)] Determinar de forma provisional la versión V del código. Este valor esta dado con la siguiente formula.
 \begin{equation}
	V = [(D/X) - 10] / 4\\
\end{equation}
\end{itemize}


\item Versión.
\begin{itemize}
 \item[] Si la versión del símbolo provisional es de 6 o menos, esto se especifica para cada versión definida. Si el valor provisional del símbolo es la versión 7 o más, la información de versión se decodifica de la siguiente manera.
 \item[a)] Dividir el ancho de la WUR patrón del buscador superior derecha por 7 para calcular el tamaño del módulo UR CP.
  \item[b)] Buscar las líneas de los puntos AC y AB de A, B y C, que pasan a través de los centros de los tres patrones de localización, como se muestra en la Figura XXX.
La matriz de muestreo determina, con base en las líneas paralelas a las líneas guías, el área de la información de la versión del código, utilizando el módulo de tamaño CP tomando valores binarios de 0 y 1 que se determinan a partir de la luz u oscuridad de la grilla de muestreo de la imagen.
 
\item[c)] Determinar la versiópn para tetectar y corregir los errores, si hay, basandose en la tabla XXX.

\item[d)] Si se detectan errores que exeden la capacidad para la corrección, entonces hay que calcular el ancho del patron localizador Wdl del lado inferior izquierdo y seguir los pasos a, b,c, para decodificar la información de la versión.
\end{itemize}


\item Versión Provisoria.
\begin{itemize}
 \item[] Para la Versión 1 del código, redefinir X como la distancia promedio de los puntos centrales de luz y oscuridad de los patrones temporales. De manera similar, el cálculo de la dimensión Y como la distancia promedio de los puntos centrales de luz y oscuridad de los patrones temporales. Establecer una red de muestreo basándose en (a) de la línea horizontal a través del patrón de sincronización superior con líneas paralelas a él, y en la vertical con un espaciamiento de Y, que comprende seis líneas por encima de la línea horizontal de referencia y todas las líneas que a continuación sean necesarias para la versión del código y (b) de la línea vertical que pasa por el patrón temporal de lado izquierdo con líneas paralelas a él en el espacio horizontal de X, que comprende seis líneas a la izquierda de la linea de referencia vertical línea y tantas líneas a la derecha del mismo que sean necesarias para la versión del símbolo. De la versión 2 y símbolos más grandes, determinar la coordenada central de cada patrón de alineación con las coordenadas que se definen en 5.3.5 y el anexo E y la construcción de las redes de muestreo con líneas equidistantes espaciados entre estos puntos.
 
 Dividir el Wul ancho del patrón localizador de la parte superior izquierda PUL por 7 para calcular el tamaño del módulo CPUL.
 \begin{equation}
	CPUL = Wul / 7\\
\end{equation}
 
 \item[b)] Determinar las coordenadas central provisional de la alineación de los patrones P1 y P2 (ver figura XX), sobre la base de la coordenada del centro de A de la parte superior izquierda del patrón localizador Pul, las líneas paralelas a la líneas guías de AB y AC obtenidos en 7c), y el tamaño del módulo CPul.
 
 \item[c)]Analizar el contorno del cuadro blanco en P1 y P2 patrón de alineación a partir del pixel de la coordenada central provisional para encontrar las coordenadas reales del centro Xi e Yj.
 
  \item[d)]Cálculo de la coordenada central provisional del patrón de alineación P3, sobre la base de la coordenadas del patrón localizador de la esquina superior izquierda Pul y las coordenadas reales del centro de los patrones de alineación  P1 y P2 obtenidos en c).
 
\item[e)] Buscar la coordenada centrales del patron de alineación, siguiendo el mismo procedimiento que en c).
 
 \item[f)]Buscar Lx, que es la distancia de centro a centro de los patrones de alineación P2 y P3, y Ly, que es la distancia de centro a centro de los patrones de alineación  P1 y P3. Se divide  Lx y Ly definido por el espacio de los patrones de alineación para obtener el módulo de CPx de la parte inferior y el CPy del lado derecho sw la parte superior izquierda del símbolo ver Figura XXX
 
  \begin{equation}
	CPx = Lx / AP\\
	CPy = Ly / AP\\
\end{equation}
 

donde AP es el espacio entre los centros de los patrones de alineación (véase la Tabla E.1).
De la misma manera, encontrar Lx ', que es la distancia horizontal entre las coordenadas central del patrón localizador la parte superior izquierda Pul y las coordenadas centrales del patron de alineación P1, y Ly', que es la distancia vertical entre las coordenadas del centro del patrón localizador superior izquierdo Pul y las coordenadas centrales del patrón de alineación P2. Dividir Lx 'y Ly' por la fórmulas siguientes para obtener el módulo de CPx ' del lado superior y CPy' del lado izquierdo en el área superior izquierda del símbolo.

	CPx '= Lx' / (coordenada X del módulo central del patrón de alineación P1 - coordenada X del módulo central del patrón localizador de la parte superior izquierda Pul)\\


CPy '= Ly' / (Fila coordenada Y del módulo central del patrón de alineación P2 patrón de alineación - coordenada Y del módulo central del patrón localizador de la parte superior izquierda Pul)\\


\item[g)] Determinación de la red de muestreo que cubre la parte superior izquierda del código basado en el módulo creado por CPX, CPx', CPy y CPy' en representación de cada lado en la parte superior izquierda del código.
\item[h)] Determinación de la misma manera que las redes de muestreo para la parte superior derecha (cubiertos por la parte superior derecha del patrón localizador  Pur y los patrones de alineación P1, P3 y P4) y el área inferior izquierda (cubiertos por la parte superior derecha del patrón localizador Pur, y los patrones de alineación P2, P3 y P5) del código.
\item[i)] Para el patrón de alineación P6, la estimación de la coordenada centrales provisionales del módulo CPx’ y CPy’, los valores de los cuales se obtienen a partir de las distancias entre los patrones de alineación P3, P4 y P5, las líneas guía que pasa por el centro de los patrones de alineación P3 y P4, P3 y P5, respectivamente, y las coordenadas centrales de estos patrones.
 
\item[j)] Repita los pasos e) hasta h) para determinar la red de muestreo de la zona inferior derecha del símbolo.
\item[k)] Los mismos principios se aplicarán para determinar los cuadrantes de muestreo para cualquier parte del símbolo que no este cubierto.

\end{itemize}


\item Muestra un área de 3 x 3 píxeles de la imagen, centrada en cada intersección de las líneas de la red y determinar si es negro o blanco basado en el umbral global. Construir una matriz de bits en donde los valores que tomara cada campo de esta será un 1 si es un área negra y un 0 si es un área blanca.

\item  decodificar la información del formato junto al patrón localizador superior izquierdo como se describe en el anexo C.2 para obtener el nivel de corrección de errores y el patrón de la máscara de datos aplicada a los datos. Si los errores exceden la capacidad de corrección de errores para obtener el formato de la información, entonces, seguir el mismo procedimiento para decodificar el formato de la información adyacente a los patrones localizadores de la parte superior derecha e inferior izquierda.

\item  Si la cadena de bits del formato de información es válido y no se puede derivar, determinar si se trata de una secuencia válida si se puede leer en dirección contraria y si es así continuar con la decodificación.

\item Aplicar XOR con el patrón de enmascaramiento a la región del código 
Esto revierte el proceso de enmascaramiento de los datos del proceso de codificación.\\

\begin{itemize}
\item[•] XOR el patrón de la máscara de datos con la región de codificación del símbolo de la liberación de la ocultación de datos y restaurar los personajes símbolo que representa los datos y palabras de código de corrección de errores. Esto revierte el efecto del proceso de enmascaramiento de datos aplicados durante el procedimiento de codificación.
\end{itemize}

\item Determine las palabras en clave del código de acuerdo con las reglas de colocación del capítulo 6.7.3.

\item  Reorganizar la secuencia de palabras claves en bloques como sea necesario para la versión de símbolos y el nivel de corrección de errores, invirtiendo el proceso de interpolación que se define en 6.6. paso 3).


\item Sigue la detección y corrección de errores del procedimiento de decodificación en el del anexo B para corregir errores y tachaduras hasta llegar a la máxima capacidad de corrección para la versión de símbolo y el nivel de corrección de errores.
\item Restaurar la secuencia del mensaje original mediante el ensamblaje de los bloques de datos en secuencia.
\item Subdividir el flujo de bits de datos en segmentos, cada uno comenzando con un indicador de modo y el largo que determina por el  número de caracteres siguiente al indicador de modo.
\item Decodificar cada segmento de acuerdo con las reglas para el modo en cuestión.

\end{enumerate}




\chapter{Procesamiento de Imágenes.}

Imagen digitalizada
Una imagen una vez que ha sido digitalizada puede ser considerada como una
función discreta f(x,y) de la forma:


es decir, una matriz de N filas y M columnas donde cada elemento se denomina píxel, y que cuenta por tanto con un total de N ∗ M píxeles.


Modelos de color
El color es una de las características más importantes que definen a los objetos. Al- gunas definiciones básicas para comprender los modelos de colores son [Hueso, 2001]:
Brillo: Sensación que indica si un área está más o menos iluminada.
Matiz o Tono: Propiedad que distingue un color de otro dentro del espectro visible, y mediante la cual distinguimos los colores por su nombre convencional: rojo, verde, azul, amarillo, etc. [Llorens, 1995].
Coloración: Sensación por la que un área tiene un mayor o menor tono. Luminosidad: Brillo de una zona respecto a otra blanca en la imagen. Crominancia: Coloración de un área respecto al brillo de un blanco de referencia. Saturación: Relación entre la coloración y el brillo.
La representación de los colores puede realizarse de diversas maneras, dando lugar a los diferentes modelos de color.
Un modelo de color es un método por el que se puede especificar, crear o visua- lizar cualquier color. Se tienen modelos de color que se utilizan para la adquisición, transmisión de las señales (por ejemplo, para la televisión), la impresión y modelos que tratan de imitar la percepción humana [Hueso, 2001].
El propósito de un modelo de color es facilitar la especificación de colores en algún formato estándar.
A continuación se describen algunos de los modelos de colores que son utilizados con mayor frecuencia en el reconocimiento de piel en imágenes.
2.4.1. RGB
El modelo de color RGB representa una composición del color en términos de los colores primarios de la luz: rojo, verde y azul (en inglés Red, Green, Blue).
Se utiliza en el color de los monitores CRT [Hearn and Baker, 1997].
En fotografía representa una captura con el 100 % de calidad y sin compresión alguna.
La manera más sencilla e intuitiva de conseguir un color en concreto es determinar la cantidad de color rojo, verde y azul que se necesita combinar, para ello se realiza la suma aritmética de las tres componentes.
CAPÍTULO 2. MARCO TEÓRICO 11
X=R+G+B
Gráficamente se representa por un cubo (Figura 2.3). En la recta que une el origen con el valor máximo se hayan los grises, ya que las tres componentes son iguales [Hueso, 2001].

imagen del cubo de color.


Ima?genes binarias
Una imagen binaria es aque?lla en la cual cada pi?xel puede tener so?lo uno de dos valores posibles 1 o 0.
La forma ma?s comu?n de generar ima?genes binarias es mediante la utilizacio?n del valor umbral de una imagen, es decir, se elige un valor li?mite, o un intervalo, a partir del cual todos los valores de intensidades mayores sera?n codificados como 1, mientras que los que este?n por debajo sera?n codificados a cero.
2.5.2. Me?todo de umbralizacio?n
Es el me?todo ma?s simple y usado. Se basa en que el valor del pi?xel este? dentro de un rango de valores especificado para un objeto.
Es efectivo cuando los objetos y el fondo de la imagen tienen rangos de valores diferentes y existe un contraste marcado entre ellos.
Como ventaja principal esta? la simplicidad de los algoritmos que los implementan. Su principal limitacio?n es que, al no establecer restricciones espaciales, son muy sensibles al ruido.
Umbralizacio?n simple
Sea una imagen f(x,y), compuesta de objetos luminosos sobre un fondo oscuro, de tal forma que los pi?xeles del objeto y fondo tienen sus valores agrupados en dos modos dominantes. Una forma de extraer los objetos es elegir un Umbral T que

separe dichos modos. Asi?, cualquier punto (x, y) para el que f (x, y) > T se denomina punto del objeto; en caso contrario, se denomina punto del fondo.
En general, la umbralizacio?n se puede contemplar como una operacio?n que implica realizar comprobaciones frente a una funcio?n T de la forma
T = T(x,y,px,y,fx,y)
donde fx,y es el valor del pi?xel en el punto (x, y), y px,y representa alguna propiedad local de ese punto [Cerrada, 2002].
Una imagen umbralizada gx,y se define como: ??
los pi?xeles marcados con 0 corresponden al fondo.
Umbralizacio?n basada en el color
\section{Reconocimiento de Bordes.}
El objetivo de la detección de bordes, en general, es reducir significativamente la cantidad de datos en una imagen y al mismo tiempo conservando las propiedades estructurales se se utilizará para el procesamiento de la imagen. Existen varios algoritmos para hacer esta tarea, pero el mas usado es el algoritmo de Canny, a pesar que es antiguo se sigue utilizando en investigación.\\
Los criterios usados por este algoritmo son:\\
\begin{enumerate}
\item Detección: Evita la eliminación de bordes importantes y no suministrar falsos bordes.
\item Localización: La distancia entre la posición real y la localizada del borde debe ser minima.
\item Número de respuestas: Intagra las respuestas múltiples correspondientes a un único borde.
\end{enumerate}

\section{Algoritmo de Canny}
El cálculo de la primera derivada es uno de los métodos relacionados con la detección de bordes, que es usada porque toma el valor de cero en las regiones donde no hay variación en la intensidad y tiene un valor constante en la transición de intensidad. Esto hace que en un cambio de intensidad se manifiesta en un cambio brusco en la primera derivada, lo que es usado para detectar el borde.\\

El algoritmo de canny consiste en tres grandes pasos:

\begin{enumerate}
\item Obtener el gradiente: Se calcula la magnitus y orientación del vector en cada píxel.
\item Supresión no máxima: Adelgazamiento del ancho de los bordes obtenidos con el gradiente, hasta lograr bordes de un píxel de ancho.
\item Histéresis de umbral: Aplicación de función de histéresis basada en dos umbrales, con esto se reduce la posibilidad de contornos falsos.
\end{enumerate}

\section{Obtener el Gradiente.}
Para obtener el gradiente, lo primero que se realiza es un filtro gaussiano a la imagen original, con el objetivo de suavizar la imagen y tratar de eliminar el ruido que exista. Esto puede presentar el problema que el suavizado sea excesivo, lo que conlleva en la perdida de detalles de la imagen y altera el resultado final de la operación.\\
A contimuación se muestra una máscara que se puede utilizar para el filtrado gaussiano.\cite{rebaza2007deteccion}\\


\[
A = {1 \over 159}\dot{}\left( \begin{array}{lcccl}
            2 & 4 & 5 & 4 & 2  \\
            4 & 9 & 12 & 9 & 4  \\
            5 & 12 & 15 & 12 & 5\\
            4 & 9 & 12 & 9 & 4  \\
            2 & 4 & 5 & 4 & 2\\
           \end{array}
    \right)
\]
\subsubsection{Supresión no máxima}
La imágen resultante en el paso anterior sirve como entrada para generar una imágen con los bordes adelgazados. Se utilizan cuatro direcciones con las orientaciones de 0, 45, 90 y 135 grados con respecto al eje horizontal. Para cada píxel se encuentra la dirección que mejor se aproxima a la dirección del angulo del gradiente.

\subsubsection{Histéresis de umbral}
Generalmente la imágen que se obtiene contiene máximos locales que se producen por el ruido. Una solución para eliminar este ruido es la histéresis del umbral.\\
Este proceso consiste en tomar la orientación de los puntos de borde de la imágen y tomar dos umbrales, el primero mas pequeño que el segundo.\\
En cada punto de la imágen se localiza el siguiente punto de borde no explorado, este tiene que ser mayor al segundo umbral. A partir de dicho punto seguir las cadenas de máximos locales conectados en ambas direcciones perpendiculares a la normal del borde siempre que sean mayores al primer umbral. Así se marcan todos los puntos explorados y se almacena la lista de todos los puntos en el contorno conectado. 

\chapter{J2ME}
Este capítulo presenta una serie de descripciones de la tegnología utilizada para la creación de una aplicación utilizada en un dispositivo movil con plataforma Java.
\section{Descripci\'on general}
La edición Java 2 Micro Edition (J2ME) fue presentada en 1999 por Sun Microsystems con el propósito de habilitar aplicaciones Java para pequeños dispositivos. En esta presentación, lo que realmente se enseñó fue una primera versión de una nueva Java Virtual Machine (JVM) que podía ejecutarse en dispositivos con bajas prestaciones. Para empezar podemos decir que Java Micro Edition es la versión del lenguaje Java que está orientada al desarrollo de aplicaciones para dispositivos pequeños con capacidades restringidas tanto en pantalla gráfica, como de procesamiento y memoria (teléfonos móviles, PDA`s, etc). La tardía aparición de esta tecnología, (hemos visto que la tecnología Java nació a mediados de los 90 y Java Micro Edition apareció a finales), puede ser debido a que las necesidades de los usuarios de telefonía móvil ha cambiado mucho en estos últimos años y cada vez demandan más servicios y prestaciones por parte tanto de los terminales como de las compañías. Además el uso de esta tecnología depende del asentamiento en el mercado de otras, como GPRS, íntimamente asociada a J2ME y que no ha estado a nuestro alcance hasta hace poco.\\


\section{An\'alisis de Versiones.}
La empresa que era SUN en esos tiempos, del inicio de Java, creo las herramientas para cubrir las 
necesidades de todos los usuarios. Dado esto el paquete de Java 2 se puede dividir en 3 ediciones. J2SE (Java Standard Edition) orientada al desarrollo de aplicaciones de tamaño normal, J2EE (Java Enterprise Edition) orientada al entorno empresarial y J2ME (Java Micro Edition) orientada a dispositivos con capacidades restringidas.\\


Algunas caracteristicas de las 3 ediciones del paquete Java 2.
\begin{enumerate}



\item Java 2 Platform, Standard Edition (J2SE):

\begin{itemize}
\item[•] Inspirado inicialmente en C++, pero con componentes de alto nivel, como soporte nativo de strings y recolector de basura.
\item[•] Código independiente de la plataforma, precompilado a bytecodes intermedio y ejecutado en el cliente por una JVM (Java Virtual Machine).
\item[•] Modelo de seguridad tipo sandbox proporcionado por la JVM.
\item[•] Abstracción del sistema operativo subyacente mediante un juego completo de APIs de programación.
\end{itemize}

\item Java 2 Platform, Enterprise Edition (J2EE):
\begin{itemize}
\item[•]  Está pensado para ser ejecutado sobre una red de ordenadores de manera distribuida y remota mediante EJBs (Enterprise Java Beans).
\item[•] requiere que se sea capaz de integrar datos provenientes de entornos heterogéneos.
\item[•] Esta edición está orientada especialmente al desarrollo de servicios web, servicios de nombres, persistencia de objetos, XML, autenticación, APIs para la gestión de transacciones, etc.
\item[•] Abstracción del sistema operativo subyacente mediante un juego completo de APIs de programación.
\end{itemize}

\item Java 2 Platform, Micro Edition (J2ME):
\begin{itemize}
\item[•] Esta versión de Java está enfocada a la aplicación de la tecnología Java en dispositivos electrónicos con capacidades computacionales y gráficas muy reducidas.
\item[•]Esta edición tiene unos componentes básicos que la diferencian de las otras versiones, como el uso de una máquina virtual denominada KVM (Kilo Virtual Machine, debido a que requiere sólo unos pocos Kilobytes de memoria para funcionar).
\item[•] Incluye  un pequeño y rápido recolector de basura.

\end{itemize}

\end{enumerate}

\begin{figure}[h]
  \centering
    \includegraphics[height=6cm]{arquitecturaJava.eps}
    \caption{Arquitectura de la plataforma Java 2.}
  \label{fig:Arquitectura de la plataforma Java 2.}
\end{figure}

\section{Nociones Generales de J2ME}

Componentes que forman parte de la tecnología.\\

La maquina virtual Java es un componente importante al momento de ejecutar la aplicación, estas nos entrega opciones para los distintos tipos de dispositivos.\\

La configuración, es un conjunto de clases básicas que nos proveen de servicios que conforman la base de las implementaciones para dispositivos específicos. Existen 2 configuraciones definidas en J2ME, CLDC, enfocada a dispositivos limitados en procesamiento y memoria, y CDC, enfocada a dispositivos con mas recursos.\\

Los perfiles, son bibliotecas Java con clases específicas para implementar funcionalidades de alto nivel en dispositivos específicos.\\

Un entorno de ejecución determinado de J2ME se compone de lo siguiente:\\

\begin{itemize}
\item[a)] Maquina Virtual.
\item[b)] Configuración.
\item[b)] Perfil.
\item[b)] Paquetes Opcionales.
\end{itemize}


\section{Maquinas Virtuales.}

Las maquinas virtuales son las encargadas de interpretar el c\'odigo precompilado de un programa Java precompilados a lenguaje maquina, obtener la informaci\'on del sistema operativo y observar las reglas de seguridad y correcciones del c\'odigo definidas para el lenguaje Java. De esta manera se logra la independencia del sistema operativo y el hardware que se utilice.

Falta especificaciones de las maquinas

\section{Configuraciones}
Las configuraciones presentan distintas caracteristicas y entregan herramientas o funcionalidades diferentes respecto a las capacidades de los dispositivos. Las especificaciones de las caracter\'isticas se presentan a continuaci\'on.




Configuración de dispositivos con conexión, CDC (Connected Device Configuration)
La CDC está orientada a dispositivos con cierta capacidad computacional y de memoria. Por ejemplo, decodificadores de televisión digital, televisores con internet, algunos electrodomésticos y sistemas de navegación en automóviles. CDC usa una Máquina Virtual Java similar en sus características a una de J2SE, pero con limitaciones en el apartado gráfico y de memoria del dispositivo. Ésta Máquina Virtual es la que hemos visto como CVM (Compact Virtual Machine). La CDC está enfocada a dispositivos con las siguientes capacidades:
\begin{itemize}
\item[•] Procesador de 32 bits.
\item[•] Disponer de 2 Mb o más de memoria total, incluyendo memoria RAM y ROM.
\item[•] Poseer la funcionalidad completa de la Máquina Virtual Java2.
\item[•] Conectividad a algún tipo de red.
\end{itemize}


Configuración de dispositivos limitados con conexión, CLDC (Connected Limited Device Configuration).
La CLDC está orientada a dispositivos dotados de conexión y con limitaciones
en cuanto a capacidad gráfica, cómputo y memoria. Un ejemplo de éstos dispositivos\\
Capítulo 1: Introducción	
son: teléfonos móviles, buscapersonas (pagers), PDAs, organizadores personales, etc. Ya hemos dicho que CLDC está orientado a dispositivos con ciertas restricciones. Algunas de éstas restricciones vienen dadas por el uso de la KVM, necesaria al trabajar con la CLDC debido a su pequeño tamaño. Los dispositivos que usan CLDC deben cumplir los siguientes requisitos:


\begin{itemize}
\item[•] Disponer entre 160 Kb y 512 Kb de memoria total disponible. Como mínimo se debe disponer de 128 Kb de memoria no volátil para la Máquina Virtual Java y las bibliotecas CLDC, y 32 Kb de memoria volátil para la Máquina Virtual en tiempo de ejecución.
\item[•]  Procesador de 16 o 32 bits con al menos 25 Mhz de velocidad.
\item[•] Poseer la funcionalidad completa de la Máquina Virtual Java2.
\item[•] Ofrecer bajo consumo, debido a que éstos dispositivos trabajan con suministro de energía limitado, normalmente baterías.
\item[•]  Tener conexión a algún tipo de red, normalmente sin cable, con conexión intermitente y ancho de banda limitado (unos 9600 bps).
\end{itemize}

La CLDC aporta las siguientes funcionalidades a los dispositivos:

\begin{itemize}
\item[•] Un subconjunto del lenguaje Java y todas las restricciones de su Máquina Virtual (KVM).
\item[•] Un subconjunto de las bibliotecas Java del núcleo. o Soporte para E/S básica.
\item[•] Soporte para acceso a redes.
\item[•] Seguridad.

\end{itemize}

\section{Perfiles}
Acabamos de decir que el perfil es el que define las APIs que controlan el ciclo de vida de la aplicación, interfaz de usuario, etc. Más concretamente, un perfil es un conjunto de APIs orientado a un ambito de aplicación determinado.

Los perfiles identifican un grupo de dispositivos por la funcionalidad que proporcionan (electrodomésticos, teléfonos móviles, etc.) y el tipo de aplicaciones que se ejecutarán en ellos. Las librerías de la interfaz gráfica son un componente muy importante en la definición de un perfil. Aquí nos podemos encontrar grandes diferencias entre interfaces, desde el menú textual de los teléfonos móviles hasta los táctiles de los PDAs.
El perfil establece unas APIs que definen las características de un dispositivo, mientras que la configuración hace lo propio con una familia de ellos. Esto hace que a la hora de construir una aplicación se cuente tanto con las APIs del perfil como de la configuración. Tenemos que tener en cuenta que un perfil siempre se construye sobre una configuración determinada. De este modo, podemos pensar en un perfil como un conjunto de APIs que dotan a una configuración de funcionalidad específica.
Ya hemos visto los conceptos necesarios para entender cómo es un entorno de ejecución en Java Micro Edition. Este entorno de ejecución se estructura en capas, una construida sobre la otra como veíamos en la figura 3.
Anteriormente vimos que para una configuración determinada se usaba una Máquina Virtual Java específica. Teníamos que con la configuración CDC usábamos la CVM y que con la configuración CLDC usábamos la KVM. Con los perfiles ocurre lo mismo. Existen unos perfiles que construiremos sobre la configuración CDC y otros que construiremos sobre la CLDC. Para la configuración CDC tenemos los siguientes perfiles:\\


\section{¿Que es una Metodología?}
"Conjunto de métodos que se siguen en una investigación científica o en una exposición doctrinal".
% real academia española

\section{Metodología de desarrollo del software.}
Durante el ciclo de vida del software se deben completar una serie de tareas para obtener un producto de software. Además se puede distinguir que los componentes del software deben pasar por distintas fases o etapas durante el proceso de desarrollo o ciclo de vida. Cada una de estas tareas se pueden desarrollar y resolver de muchas maneras, con distintas herramientas y usando alguna técnica. Además tenemos que especificar cuándo se termina una tarea, quien debe realizarla, que tareas preceden o anteceden a una dada, que documentación utilizaremos para llevar a cabo esa tarea.\\

Existe una amplia gama de metodologías ágiles que permiten desarrolar softwares, las cuales entregan herramientas que guian en la creación de estos, una de estas es FDD.\\

Feature Driven Development (FDD): Define un proceso iterativo que consta de 5 pasos. Las iteraciones son cortas (hasta 2 semanas). Se centra en las fases de diseño e implementación del sistema partiendo de una lista de características que debe reunir el software. 

FDD es una metodología desarrollada alrededor del año 1998 que presenta las características de un proceso ágil. Esta pensado en proyectos con tiempo de desarrollo relativamente cortos(menos de un año). Se basa en un proceso iterativo con iteraciones cortas (2 semanas aproximadamente), que producen un software funcional que el cliente y la dirección de la empresa pueden ver y monitoriar.\\
Las iteraciones se deciden en base a funcionalidades, que son pequeñas partes del software con significado para el cliente.\\

Un proyecto que sigue FDD se divide en 5 fases:\\
\begin{enumerate}
\item Desarrollo de un modelo general.
\item Construcción de la lista de funcionalidades.
\item Plan de releases en base a las funcionalidades a implenentar.
\item Diseñar en base a las funcionalidades.
\item Implementar en base a las funcionalidaades.
\end{enumerate}

La primera actividad consiste en Desarrollar un Modelo General, que actua en paralelo con la construcción de la arquitectura del software. Cuendo se  crea este modelo participan tanto los expertos en el dominio como los desarrolladores. Mediante el esfuerzo de ambas partes se intenta lograr lo que el modelo en espiral proponía con sus primeras iteraciones: un conocimiento global de la aplicación a construir, el entendimiento del negocio en que esta embebida, un primer bosquejo de las features del software, y la definición de restricciones y cuestiones no funcionales. Para esto, se desarrollarán: diagramas de los paquetes, con las clases esenciales y las responsabilidades de las mismas.\\

La segunda actividad, Construir una Lista de funcionalidades, comienza tomando el bosquejo de funcionalidades formulado durante la actividad anterior para refinar las funcionalidades incluidas. Una vez que se han identificado las mismas se las agrupa jerárquicamente para poder estructurar el trabajo de desarrollo; se asignan prioridades segun la satisfacción del cliente – las prioridades sugeridas para las funcionalidades por FDD son: A (debe tener), B (sería útil tener), C (agregar si es posible), o D (futuro); finalmente, se pondera la importancia de cada una para su posterior implementación.\\

La tercera actividad, Planificar por Funcionalidades, toma como input la lista priorizada de la fase anterior y establece los tiempos para las futuras iteraciones. En esta actividad participan el líder de proyecto, el líder de desarrollo y el programador jefe. A medida que se realiza la planificación se delinean los hitos de finalización de las iteraciones, dejando claro cuales son los funcionalidades o conjunto de estas que estarán construidos en dichos hitos. Ademas incluye el encargado de programación.\\

Las últimas dos actividades, Diseñar por Funcionalidades y Construir por Funcionalidad, están relacionadas con la parte productiva del proceso en que se construye la aplicación de manera incremental. Empezando por el diseño que toma las funcionalidades correspondientes a la iteración, el equipo de programadores liderado por el programador jefe identifica las clases, atributos y métodos que realizan la funcionalidad requerida.\\

Se utilizó esta metodología por la facilidad de adaptarla al proceso de desarrollo de la memoria, dado que permite tener equipos de trabajo reducidos y que además existe un conocimiento casi total de los requerimientos a desarrollar durante el proceso. Por otra parte no se puede utilizar una metodología tradicional dado que no es un proyecto de software de gran tamaño y el equipo de desarrollo es de una persona.
\chapter{Diseño.}

En este capítulo se mostrará la manera en la cual se resolvió el problema y el diseño de la solución para resolver el problema.

\section{Descripcion general del problema.}

El problema principal se presenta, dada la creación del nuevo código de barra QRCode y conociendo sus cualidades, cuando los celulares o dispositivos móviles con baja capacidad de proceso y con una cámara limitada en sus caracteristicas quieren capturar una imágen del código y poder decodificarla, estos no cuentan con una herramienta adecuada que permite esta acción, podemos agregar que la plataforma con la que contamos para ejecutar esta aplicación es una KVM reducida basada en el estandar J2ME.

\section{Solución.}
Para resolver este problema existen varias formas, alguna de estas necesitan conección a internet y otras resuelven el problema sin necesidad de conecciónes externas.

\subsection{Opciones para la solución.}
\begin{itemize}

\item[•]Una posible solución para la decodificación de este código es que la aplicación sea capaz de capturar la imágen y enviarla a través de internet a un servicio web que decodifique remotamente la imágen y que entregue como respuesta el contenido decodificado de éste código y sea mostrado en una interfaz de usuario.

\item[•]Otra opción es que la aplicación sea capaz de capturar, procesar la imágen y decodificar el código totalmente en el dispositivo sin necesidad de un servicio externo.

\end{itemize}

\section{Requisitos.}


\section{Casos de Usos.}

\section{Arquitectura.}

\section{Diagramas Clases.}

\section{Diagrama Secuencia.}

\chapter{Resultados y Análisis de Resultados.}

\chapter{Conclusiones.}

\section{Trabajo futuro.}


\chapter{Anexos}
\section{Planificación}

\subsection{Planificación}

\begin{figure}[h]
    \centering
    \includegraphics[width=\textwidth]{planificacion}
    \caption{Planificación de actividades}
    \label{fig:planificacion}
  \end{figure}
  
\bibliographystyle{plain} 
\bibliography{refs}

\end{document}
